﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using UricaoWeb.Datos.Excepciones.Empleado;
using UricaoWeb.Datos.ConexionBD.Empleados;

namespace UricaoWeb.LogicaDeNegocios.Empleados
{
    public class LogicaNegocioEmpleado : ApiController
    {
        #region Variable Locales

        private OperacionesBDEmpleado _operacionesLogico;
        private EmpleadoLogico _empleado = new EmpleadoLogico();
        private ListaEmpleadoLogico _listaEmpleado = new ListaEmpleadoLogico();
        public static string _mensaje;

        #endregion

        #region Métodos

        /// <summary>
        /// Constructor de la clase LogicaNegocioEmpleado
        /// </summary> 

        public LogicaNegocioEmpleado()
        {
            _operacionesLogico = new OperacionesBDEmpleado();
        }

        /// <summary>
        /// Función que permite actualizar datos 
        /// Parametro:
        /// Object empleado: Se le pasa el objeto Empleado para actualizar
        /// Retorno:
        /// bool true: Si se realiza correctamente, false: No se realiza correctamente
        /// </summary> 

        public bool ActualizarEmpleadoLogico(EmpleadoLogico empleado)
        {
            try
            {
                return _operacionesLogico.ActualizarEmpleadoBD(empleado.Empleado);
            }
            catch (ExcepcionesEmpleado exception)
            {
                _mensaje = exception.CodigoErrorExcepcion + " " + exception.CodigoErrorExcepcion;
                return false;
            }
        }


        /// <summary>
        /// Funcion que se conecta con la capa de datos y obtiene el objeto devuelto 
        /// por la base de datos para ser llevado a la capa de presentación
        /// Parametro:
        /// int idEmpleado: Parametro de busqueda para buscar a un solo empleado
        /// int fkHotel: Parametro que indica en el hotel va a buscar el empleado
        /// Retorno:
        /// Object Empleado: Devuelve el objeto de tipo Empleado
        /// </summary>

        public EmpleadoLogico EmpleadoUnicoLogico(int idEmpleado, int fkHotel)
        {
            try
            {
                _empleado.Empleado = _operacionesLogico.EmpleadoUnicoBD(idEmpleado, fkHotel);
                return _empleado;
            }
            catch (ExcepcionesEmpleado exception)
            {
                _mensaje = exception.CodigoErrorExcepcion + " " + exception.CodigoErrorExcepcion;
                return null;
            }
        }

        /// <summary>
        /// Funcion que pide a la capa de datos una lista de empleado
        /// Parametro:
        /// int fkHotel: Es el id del hotel donde se realizo la búsqueda 
        /// Retorno: 
        /// List<Empleado>: Lista de todos los empleados
        /// </summary>

        public ListaEmpleadoLogico EmpleadoListaLogico(int _fkHotel)
        {
            try
            {
                _listaEmpleado.ListaEmpleadosLogico = _operacionesLogico.ListaEmpleadoBD(_fkHotel);
                return _listaEmpleado;
            }
            catch (ExcepcionesEmpleado exception)
            {
                _mensaje = exception.CodigoErrorExcepcion + " " + exception.CodigoErrorExcepcion;
                return null;
            }
        }


        /// <summary>
        /// Funcion que me retorna una lista de empleados segun una busqueda
        /// Parametro:
        /// string nombreApellido: Nombre o apellido del empleado
        /// int fkHotel: El id del hotel
        /// Retorno:
        /// List<Empleado>: Lista de empleados obtenida de la búsqueda
        /// </summary>

        public ListaEmpleadoLogico EmpleadoSearchLogico(string nombreApellido, int fkHotel)
        {
            try{
                _listaEmpleado.ListaEmpleadosLogico = _operacionesLogico.EmpleadoSearchBD(nombreApellido, fkHotel);
                return _listaEmpleado;
            }
            catch (ExcepcionesEmpleado exception)
            {
                _mensaje = exception.CodigoErrorExcepcion + " " + exception.CodigoErrorExcepcion;
                return null;
            }
        }

        /// <summary>
        /// Función que inserta el objeto Empleado en la capa de datos
        /// Parametro:
        /// Object Empleado: Objeto que tiene el conjunto de datos a insertar empleado en la capa de datos
        /// Retorno:
        /// bool true: Si se inserta correctamente, false: No se inserta correctamente
        /// </summary> 

        public bool InsertarEmpleado(EmpleadoLogico empleado)
        {
            try 
            {
            return _operacionesLogico.AgregarEmpleado(empleado.Empleado);
            }
            catch (ExcepcionesEmpleado exception)
            {
                _mensaje = exception.CodigoErrorExcepcion + " " + exception.CodigoErrorExcepcion;
                return false;
            }
        }

        /// <summary>
        /// Función que inserta el objeto Usuario en la capa de datos
        /// Parametro:
        /// Object Usuario: Objeto que tiene el conjunto de datos a insertar usuario en la capa de datos
        /// Retorno:
        /// bool true: Si se inserta correctamente, false: No se inserta correctamente
        /// </summary> 

        public bool AgregarUsuario(Usuario usuario)
        {
            try
            {
                return _operacionesLogico.AgregarUsuario(usuario);
            }
            catch (ExcepcionesEmpleado exception)
            {
                _mensaje = exception.CodigoErrorExcepcion + " " + exception.CodigoErrorExcepcion;
                return false;
            }
        }

        /// <summary>
        /// Función que me devuelve el último id de empleado insertado en la capa de
        /// Retorno:
        /// int variable que retorna el último id de empleado insertado
        /// </summary> 

        public int maximo()
        {
            try
            {
            return _operacionesLogico.MaxId();
            }
            catch (ExcepcionesEmpleado exception)
            {
                _mensaje = exception.CodigoErrorExcepcion + " " + exception.CodigoErrorExcepcion;
                return 0;
            }
        }

        /// <summary>
        /// Función me devuelve cuantos empleados hay en la base de datos
        /// Parametro:
        /// string nombreEmpleado: Nombre del empleado
        /// string apellidoEmpleado: Apellido del empleado
        /// Retorno:
        /// int Variable al cual se asigna la cantidad de veces que existe el empleado
        /// </summary> 

        public int VerificarExistenciaNombreApellido(string nombreEmpleado, string apellidoEmpleado)
        {
            try
            {
                return _operacionesLogico.VerificarExistenciaNombreApellido(nombreEmpleado, apellidoEmpleado);
            }
            catch (ExcepcionesEmpleado exception)
            {
                _mensaje = exception.CodigoErrorExcepcion + " " + exception.CodigoErrorExcepcion;
                return 0;
            }
        }

        /// <summary>
        /// Función me devuelve si el correo existe o no
        /// Parametro:
        /// string correoEmpleado: Correo del empleado
        /// Retorno:
        /// bool true si no existe y false si ya existe
        /// </summary> 

        public bool ValidarCorreoNuevo(string correoEmpleado)
        {
            try
            {
                return _operacionesLogico.CorreoUnico(correoEmpleado);
            }
            catch (ExcepcionesEmpleado exception)
            {
                _mensaje = exception.CodigoErrorExcepcion + " " + exception.CodigoErrorExcepcion;
                return false;
            }
        }

        /// <summary>
        /// Función me devuelve si el correo existe y pertenece al mismo empleado o no
        /// Parametro:
        /// string correoEmpleado: Correo del empleado
        /// Retorno:
        /// bool true si no existe y le pertenece a ese empelado y false si ya existe
        /// </summary> 

        public bool ValidarCorreoModificar(string correoEmpleado, int idEmpleado)
        {
            try
            {
            return _operacionesLogico.CorreoUnico(correoEmpleado, idEmpleado);
            }
            catch (ExcepcionesEmpleado exception)
            {
                _mensaje = exception.CodigoErrorExcepcion + " " + exception.CodigoErrorExcepcion;
                return false;
            }
        }
        #endregion
    }
}